0327 或许这是一个开始

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中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值