拙木鸟


私信TA

用户名:723

访问量:17096

签 名:

等  级
排  名 1243
经  验 3033
参赛次数 0
文章发表 15
年  龄 0
在职情况 学生
学  校 上海大学
专  业

  自我简介:

不是很会,所以写得比较冗长,没有人上传,我就发一个。

主要分成以下几块:

一、输入部分:用一个容量1000的字符数组存储,然后读取直到换行。至于遇0结束,同样进行处理计算,在处理过程中再判断。

二、输出部分:看着答案最后才一次性输出,其实可以用一个数组存储每次的处理结果,输入一行就处理一次。所以只要用一个字符数组就够了。

三、处理过程:

1、这边采用10000进制,把长数据,切成每4个数一组存入一个整型数组,再基于这个数组去计算。

2、通过观察是不是数组内都为0,来判断是否遇到0

3、因为数据很长,一次处理差不多就等于去掉一位,所以一次肯定完成不了,要进行迭代。每次就去掉个位,再减去5*个位,直到数据小于10000,这时候就可以通过普通的计算去做最后的判断;


#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int flag;
int n;
int fun(int a[])
{
    int if0 = 0;    //用来判断是否为0;
    for (int i = 0; i < n; i++)
    {
        if (a[i] != 0)
            if0 = 1;
    }
    if (if0 == 0)
        return 2;

    //进行是否是17倍数的计算
    int less10000;
    less10000 = iteration(a);

    int b, c, d;
    b = less10000 / 10;
    c = less10000 % 10;
    d = b - 5 * c;
    if (d % 17 == 0)
        flag = 1;
    else
        flag = 0;

    return flag;
}

int iteration(int a[])        //不断进行:减去个位、减去5倍个位,直到小于数值10000
{
    int iunit;
    int big10000 = 0;
    for (int i = 0; i < n-1; i++)    //检查是否大于10000
    {
        if (a[i] != 0)
            big10000 = 1;
    }
    if (big10000 == 0)
        return a[n-1];
    else
    {
        iunit = a[n-1] % 10;

        for (int i = n-1; i > 0; i--)        //去掉个位
        {
            a[i] = a[i] / 10 + a[i - 1] % 10 * 1000;
        }
        a[0] = a[0] / 10;    
        a[n-1] = a[n-1] - 5 * iunit;
        for (int i = n - 1; i > 0; i--)
        {
            if (a[i] < 0)
            {
                a[i] += 10000;
                a[i - 1] -= 1;
            }
            else
                break;
        }
    }
    iteration(a);
}

int main()
{
    char c_input[1000];
    char c_temp[4];
    int i_a[250];
    int k = 0;        //输入多少位数字:k
    int a_flag[10]; //存储全部结果然后一次性输出
    int i = 0, j = 0,m=0;    //i:临时字符串;j:1000位字符串的位置;m:存储flag光标的位置;n:整型数组光标的位置
    while( m<10)
    {
        k = 0;
        n = 0;
        j = 0;
        while (scanf("%c", &c_input[k]) && c_input[k] != '\n')
        {
            k++;        
        }
        while (c_input[j] != '\n')
        {
            i = 0;
            if (j == 0)         //在最高位前面补0;
            {
                int x = k % 4;
                if(x!=0)
                    for (i = 0; i < 4 - x; i++)
                    {
                        c_temp[i] = '0';
                    }    
            }
            for (i; i < 4; i++)
            {
                c_temp[i] = c_input[j];
                j++;
            }
            i_a[n] = atoi(&c_temp);
            n++;
        }

        flag = fun(i_a);
        if (flag == 2)
            break;
        a_flag[m] = flag;
        m++;
    }
    for (i = 0; i < m; i++)printf("%d\n", a_flag[i]);
    system("pause");
    return 0;
}

 

0.0分

0 人评分

  评论区

。。。我也不会 来看看你的
2017-06-18 17:02:52
  • «
  • 1
  • »