1. 程式人生 > >C程式-藍橋-數字遊戲

C程式-藍橋-數字遊戲

問題描述

  棟棟正在和同學們玩一個數字遊戲。

  遊戲的規則是這樣的:棟棟和同學們一共n個人圍坐在一圈。棟棟首先說出數字1。接下來,坐在棟棟左手邊的同學要說下一個數字2。再下面的一個同學要從上一個同學說的數字往下數兩個數說出來,也就是說4。下一個同學要往下數三個數,說7。依次類推。

  為了使數字不至於太大,棟棟和同學們約定,當在心中數到 k-1 時,下一個數字從0開始數。例如,當k=13時,棟棟和同學們報出的前幾個數依次為:
  1, 2, 4, 7, 11, 3, 9, 3, 11, 7。

  遊戲進行了一會兒,棟棟想知道,到目前為止,他所有說出的數字的總和是多少。

輸入格式

  輸入的第一行包含三個整數 n,k,T,其中 n 和 k 的意義如上面所述,T 表示到目前為止棟棟一共說出的數字個數。

輸出格式

  輸出一行,包含一個整數,表示棟棟說出所有數的和。

樣例輸入

3 13 3

樣例輸出

17

樣例說明

  棟棟說出的數依次為1, 7, 9,和為17。

資料規模和約定

  1 < n,k,T < 1,000,000;

思路:

1.迴圈求出每個人報的數,若遇到棟棟報的數便求和,演算法是沒有問題的,但是會超時,必須進行演算法優化;66%通過

2.其實只要棟棟報的數就行了,其他人報的數並不會影響結果,所以直接求棟棟報的數,然後求和。

#include <stdio.h>
/*
int resolve(int n,int k,int T)//思路1,66%通過
{
    int s=1,i=0;
    int sum=1;
        for(int j=1;;j++)//死迴圈
        {
            s=s+j;
            if(s>k)//判斷是否大於k,
            {
                s=s%k;//大於則只取小於K的部分    
            }
    
            if(j%n==0)//統計棟棟報過幾次數
            {
                i++;
                if(i>=T)//次數達到T則結束迴圈
                break;
//                printf("%d-%d\n",sum,s);
                sum=sum+s;//棟棟報的數求和
            }
        }
        printf("%d",sum);
        return 0;
}
*/
int resolve_1(long long n,long long k,long T)//思路2
{
    long long s=1,l=1,sum=0;
    for(long long i=0;i<T;i++)
    {
        sum=sum+s;//棟棟報的數求和
        s=s+n*(l+l+n-1)/2;//直接求棟棟報的數
        l=l+n;//跳過其他人
        s=s%k;//s只取小於K的部分
    }
    printf("%lld",sum);
    return 0;
}

int main( ) 
{
    long long n,k,T;
    scanf("%lld%lld%lld",&n,&k,&T); 
    resolve_1(n,k,T);
    return 0;
}