Training 1:整数算法训练
1.题目:通过编程实现,统计1~n有多少个9
提示:n通过参数传入
# include <stdio.h>
int main()
{
int n;
int i,j;
int count;
int temp;
printf("please input n: \n");
scanf("%d",&n);
count = 0;
for(i = 1;i <= n;i ++)
{
temp = i;
while(temp > 0)
{
j = temp % 10;
temp = temp / 10;
if(j == 9)
{
count ++;
}
}
}
printf("1-n内9的个数:%d\n",count);
return 0;
}
这里由于n是通过键盘输入,可能是一位数,也可能是两位数,甚至更多位,那对于9的判断,就涉及到取余,9%10=9,所以直接对所给的数第一步进行取余,第二部进行整除10,也就是剔除掉刚刚取余出来的数,对取余出来的数进行判断,等于9就计数加一,因为n的位数不定,那就需要循环将n的每一位数都提取出来,所以循环的条件就是temp一步步整除10直到小于0为止。
2.题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位.
提示:用数组完成
# include <stdio.h>
# define N 1024
int main()
{
int target_num;
int travelsal_i;
int temp;
int count = 0;
int array[N];
printf("please input target_num: \n");
scanf("%d",&target_num);
for(travelsal_i = 0;travelsal_i < target_num;travelsal_i ++)
{
array[travelsal_i] = travelsal_i + 1;
}
temp = target_num;
travelsal_i = 0;
while(target_num > 1)
{
if(array[travelsal_i] != 0)
{
count ++;
}
if(count == 3)
{
array[travelsal_i] = 0;
target_num --;
count = 0;
}
travelsal_i ++;
if(travelsal_i == temp)
{
travelsal_i = 0;
}
}
for(travelsal_i = 0;travelsal_i < temp;travelsal_i ++)
{
if(array[travelsal_i] != 0)
{
printf("final=%d\n",array[travelsal_i]);
}
}
return 0;
}
对于3报数,之前我一直走入一个误区,我将所有的数放进一个数组,然后使用另一个数组来存放下标不是3倍数的数,然后再将这个数组赋给上一个数组,问题在于难道每次人数刚好是3的 倍数吗?第一个人每次都会报1吗?显然,这是错误的。
新的思路:将所有数放在一个数组,然后从第一个开始,每计一个数,count+1 下标+1,当count=3时,则使这个数为0,总数-1,当下标等于原始总数时,说明全部循环完,使i=0继续开始循环。
3.题目:输入5个数(含负数、小数)将它们按由小到大的顺序排列起来
提示:需要排数的数字通过参数传递进来,
例如:输入:./a.out -1 2.1 -3 5 7 输出: -3 -1 2.1 5 7
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
int main(int argc,char **argv)
{
int index;
int index1;
int min;
char *temp = NULL;
for(index = 0;index < argc;index++)
{
min = index;
for(index1 = index + 1;index1 < argc;index1++)
{
if(compare(argv[min],argv[index1]) >= 0)
{
min = index1;
}
}
if(min !=index)
{
temp = argv[min];
argv[min] = argv[index1];
argv[index1] = temp;
}
}
for(index = 0;index < argc;index++)
{
printf("%s",argv[index]);
}
printf("\n");
return 0;
}
int compare(char *num1,char *num2)
{
if(strcmp(num1,num2) == 0)//num1=num2
{
return 0;
}
if((*num1 == '-') && (*num2 != '-'))//num1<num2
{
return -1;
}
if((*num1 != '-') && (*num2 == '-'))//num1>num2
{
return 1;
}
if((*num1 == '-') && (*num2 == '-'))
{
num1++;
num2++;
while((*num1 != '\0') && (*num2 != '\0'))
{
if((*num1 - '0') > (*num2 - '0'))//num1<num2
{
return -1;
}
if((*num1 - '0') < (*num2 - '0'))//num1>num2
{
return 1;
}
if((*num1 == '.') && (*num2 != '.'))//-3.1>-31
{
return 1;
}
if((*num1 != '.') && (*num2 == '.'))//-31<-3.1
{
return -1;
}
num1++;
num2++;
}
if(*num1 == '\0')//-3.14>-3.142
{
return 1;
}
else
{
return -1;
}
}
if((*num1 != '-') && (*num2 != '-'))
{
while((*num1 != '\0') && (*num2 != '\0'))
{
if((*num1 - '0') > (*num2 - '0'))//num1>num2
{
return 1;
}
if((*num1 - '0') < (*num2 - '0'))//num1<num2
{
return 1;
}
if((*num1 != '.') && (*num2 =='.'))//33>3.3
{
return 1;
}
if((*num1 == '.') && (*num2 != '.'))
{
return -1;
}
num1++;
num2++;
}
}
if(*num1 == '\0')//33<333
{
return -1;
}
else
{
return 1;
}
}
很遗憾这道题目,我并没有能够自己写出来,对于数字大小的比较,由于类型的不一样,当我们单纯的采用数组来比较时,一直出现段错误,其实应该采用字符的方式,采用二级指针,每一个数又是一个一级指针,然后对这些数进行比较。
4.题目:求100以内的素数,全部打印出来
# include <stdio.h>
int main()
{
int i,j;
int temp;
printf("100以内的素数:2 \t");
temp = 1;
for(i = 3;i < 100;i ++)
{
for(j = 2;j < i;j ++)
{
temp = i % j;
if(temp == 0)
{
break;
}
}
if(temp != 0)
{
printf("%d\t",i);
}
}
return 0;
}
素数的判断标准就是其因子只有1和它本身。
这道题困惑我的是如何跳出循环这一方面????不解???
5.题目: 一个数如果恰好等于它的因子之和,这个数被成为”完数”,例如:6=1+2+3.请编程找出1000以内的完数
# include <stdio.h>
int main()
{
int i,j;
int temp;
int sum;
for(i = 1;i < 1000;i ++)
{
for(j = 1;j <= i/2;j ++)
{
temp = i % j;
if(temp == 0)
{
sum = sum + j;
}
}
if(i == sum)
{
printf("%d\t",i);
}
sum = 0;
}
return 0;
}
对于完数,主要是如何得出每个数的因子,利用for语句,对小于2/n的数依次取余,当取余结果为0时,就将其加入到sum中。