ACM输入输出规范&数根

来源:互联网 发布:技嘉的显卡怎么样 知乎 编辑:程序博客网 时间:2024/05/20 22:40

问题描述:


一个正整数的数根可以这样求得:计算该整数的各位数之和,如果结果值是单个数字,如果结果值是单个数字的和,那么这个数就是所求数根;如果结果值是由两位或两位以上的数字组成的数,则继续计算各位的数字的和,直到结果值只有一位数字为止。


例如:正整数24,  2+4=6,则6是24的树根   又如39,  3+9=12,12不是单个数字,故继续计算    1+2=3 。  故39的根为3.

输入:

输入包括多组测试数据,每组测试数据包括一个正整数,并且占一行,输入数据位0时表示输入结束。

输出:

对于每组测试数据,给出对应的输出,并且每组占一行。

输入样例:

24

39

0

输出样例

6

3


这是我在《c程序设计竞赛实训教程》中看到的一个很基础的题目。

之所以写博客记录下它,主要是为了开个头,并且介绍下ACM中输入输出数据格式问题,并且算法的一些思路。

下面来整理下我接触到这题目的想法,可能有点傻...


首先,问题并不难,要做的有这么几点

①正确分组测试,考虑输入结束条件的判断。

②先求所给数组各位数相加的和。

③判断这个相加的和是否是个位数,如果不是,执行第二步,否则就是我们想要的数根。


思路很清晰,问题很简单,上述三步就能解决问题了。

下面逐一分析。


在ACM中,往往要求输入一组或者多组数据,这就要求我们不能输入或者输入无关的语句,严格按照要求去做。

就本题多组数据的输入,有如下的框架

scanf("%ld",&num_1);while (num_1 != 0){    //数据处理语句    //输出结果    scanf("%ld",&num_1); //进行下一组数据测试}
while ( 1 ){    scanf("%ld",&num_1);    if ( num_1 == 0)    {        break;    }        //数据处理语句    //输出结果}

 

for (;scanf("%d",&num_1)!=EOF && num_1 != 0;printf(...)){//数据处理语句}


 

主流的框架应该就是这样的。  都能处理多组数据,可以当做模版记下。


至于第二个问题,要把各位数相加,主要得获取每个位置的数字。

最早想的时候,我一直是想算出这个数有几位,然后通过for循环,先%10求余得到个位数,然后再/10使这个数各位数往后移,常规的想法,计算各个位置的数字。

但是问题出来了,怎么求这个数的位数、?   .length函数?  显然在c中,这个不好实现,而在这样的一道简单题目中,不该涉及太多的问题。

于是乎,想呗。

于是乎,就有了新的思路。      没必要先判断位数,直接先%10求余得到个位数,然后再/10使这个数各位数往后移,得到新的数字进行判断,如果大于0,则说明该数还没除尽,即还有数字可以相加。   换个思路,一下简单多了。


至于第三个问题,更简单了。 得到的新数字在大循环里面判断是否大于10.然后进行相应处理。

讲到这里,应该没什么问题了,问题不难,当是练手的。

下面贴上具体代码:

#include<stdio.h>int main ( ){    long num_1, num_2;    while (1)    {        scanf("%ld",&num_1);        if ( num_1 == 0 )        {            break;        }        do        {            num_2 = 0;            while (num_1>0)            {                num_2 += num_1 % 10;                num_1 = num_1 / 10;            }            num_1 = num_2;        }while (num_1 >= 10);            printf("%ld\n",num_2);    }}


很简单的问题,c算法的开始。  加油,与君共勉。

水平有限,如果错误,欢迎指正。


原创粉丝点击