zcmu1684

Problem B: 求餘數

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 391  Solved: 135
[Submit][Status][Web Board]

Description

 給定一個數n,將自然數從1開始一直排列到n依次連接起來之後組成一個新數X,求X除以9的餘數是多少

舉個栗子:n爲10,則x爲12345678910,你給的答案是1

Input

 多組測試數據,每組給定一個正整數n(1<=n<=109

Output

 對於每個n輸出對應的餘數。

Sample Input

1210

Sample Output

131

HINT


解題思路:找規律。根據輸入的數據n,有如下規律:

n=1;1%9=1;

n=2;12%9=3;

n=3;123%9=6;

n=4;1234%9=1;

n=5;12345%9=6;

n=6;123456%9=3;

n=7;1234567%9=1;

n=8;12345678%9=0;

n=9;123456789%9=0;

n=10;12345678910%9=1;

n=11;1234567891011%9=3;

……依次類推。發現規律,序列對9的餘數在0,1,3,6,1,6,3,1,0之間取值。因此將0,1,3,6,1,6,3,1,0存入數組a;然後尋找對應關係,多次探索發現,n=n%9;a[n]就爲1--n組成數字對9取餘的餘數。

解題心得:

一開始,是用的同餘定理求的,即將數字的每一位數加起來的和,用和對9取餘,與1--n組成數字對9取餘的餘數相同,結果超時。後來也是問同學才知道的解題方法。

附上1--n組成數字的各個位數數字的和計算代碼。

int sum(int i)
{
    if(i>9)
    {
        return i%10+sum(i/10);
    }
    else
    {
        return i;
    }
}

ac代碼:

#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

int a[10] = {0,1,3,6,1,6,3,1,0};

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        n = n%9;
        printf("%d\n",a[n]);

    }
    return 0;
}

若其他有問題可以在評論區一起討論。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章