第17题
int sum_nth(unsigned int num, unsigned int n);
功 能:求出给定自然数的指定位置的数字(个位为0,十位为1,......)
参 数:num为给定的自然数;n为指定位置.
返回值:>=0,给定自然数的指定位置的数字; <0,不成功.
分 值:
//第17题
int sum_nth(unsigned int num,unsigned int n){
if(num>=0){
unsigned int i;
if(num>10){
for(i=1;i<=n;i++){
num=num/10;
if(num<10 && (n-i)>0)
return -1;
}
}
num=num%10;
return num;
}else{
return -1;
}
}
第18题
int sum_square(unsigned int num);
功 能:求出给定自然数的各位数字的平方和(例如 自然数1234的各位数字的平方和为30)
参 数:num为给定的自然数.
返回值:>=0,给定自然数的各位数字的平方和;<0,不成功.
分 值:
//第18题
int sum_square(unsigned int num){
int sum=0;
int temp;
while(num>10){
temp=num%10;
sum=sum+temp*temp;
num=num/10;
}
sum=sum+num*num;
return sum;
}
第19题
int sort_acend(double* array, unsigned int n);
功 能:对给定数组中的数按升序排序
参 数:array为给定的数组;n为数组中元素的个数.
返回值:>=0,成功排序; <0,不成功.
分 值:
//第19题
//使用选择排序算法
int sort_ascend(double *arry, unsigned int n){
unsigned int i,k;
unsigned int lowIndex;
for(i=0;i<n;i++){
lowIndex=i;
for(k=i+1;k<n;k++){
if(*(arry+k)<*(arry+i))
lowIndex = k;
}
double temp=*(arry+i);
*(arry+i)=*(arry+lowIndex);
*(arry+lowIndex)=temp;
}
bool flag1=true;
for(i=0;i<n-1;i++){
if(*(arry+i)<*(arry+i+1) && flag1){
flag1=true;
}else{
flag1=false;
}
}
if(flag1)
return 1;
return -1;
}
第20题
int sort_decend(double* array, unsigned int n);
功 能:对给定数组中的数按降序排序
参 数:array为给定的数组;n为数组中元素的个数.
返回值:>=0,成功排序; <0,不成功.
分 值:
//第20题
//插入排序算法
int sort_descend(double *arry, unsigned int n){
unsigned int i,k;
for(i=1;i<n;i++){
for(k=i;k>0;k--){
if(*(arry+k)>*(arry+k-1)){
double temp=*(arry+k);
*(arry+k)=*(arry+k-1);
*(arry+k-1)=temp;
}
}
}
bool flag1=true;
for(i=0;i<n-1;i++){
//printf("\n%.2f\n",*(arry+i));
if(*(arry+i)>*(arry+i+1) && flag1){
flag1=true;
}else{
flag1=false;
}
}
if(flag1)
return 1;
return -1;
}
第21题
int search_bin(int* array, unsigned int n, int value);
功 能:用二分检索法(也称折半法,字典法等)找出给定数值在数组中位置的下标值
参 数:array为给定的数组;n为数组中元素的个数; value为要查找的数值.
返回值:>=0, 给定数值在数组中位置的下标; <0,未找到.
分 值:
//第21题
//二分检索法
int search_bin(int* array, unsigned int n, int value){
int low=0,high=n-1,mid;//置当前查找区间上、下界的初值
while(low<=high){
if(*(array+low)==value)
return low;
if(*(array+high)==value)
return high;
//当前查找区间array[low..high]非空
mid=low+((high-low)/2);
//使用(low+high)/2会有整数溢出的问题
if(*(array+mid)==value)
return mid;//查找成功返回
if(*(array+mid)<value)
low=mid+1;//继续在array[mid+1..high]中查找
else
high=mid-1;//继续在array[low..mid-1]中查找
}
if(low>high)
return-1;//当low>high时表示所查找区间内没有结果,查找失败
}
第22题
unsigned int factorial(unsigned int n);
功 能:求给定自然数的阶乘。
参 数:n为给定的自然数.
返回值:给定数的阶乘n!.
分 值:
//第22题
unsigned int factorial(unsigned int n){
if(n==0||n==1){
return 1;
}else{
return n*factorial(n-1);
}
}
第23题
char* strn2b(unsigned int n);
功 能:求出给定自然数的二进制字符串表示(例如,5的二进制字符串表示为“101”)
参 数:n为给定的自然数.
返回值:二进制字符串数组的首地址.
分 值:
//第23题
char* strn2b(unsigned int n){
char arr[32]={};//因为是无符号整数,所以二进制表示最长为32位
for(int i=31;i>=0;i--){
if((n & 0x1)==1){
arr[i]='1';
}else{
arr[i]='0';
}
n=(n>>1);
}
return arr;
}