請教大佬們,這個題目
問題描述
求1+2+3+...+n的值。
輸入格式
輸入包括一個整數n。
輸出格式
輸出一行,包括一個整數,表示1+2+3+...+n的值。
樣例輸入
4
樣例輸出
10
樣例輸入
100
說明:有一些試題會給出多組樣例輸入輸出以幫助你更好的做題。
一般在提交之前所有這些樣例都需要測驗通過才行,但這不代表這幾組樣例資料都正確了你的程式就是完全正確的,潛在的錯誤可能仍然導致你的得分較低。
樣例輸出
5050
資料規模與約定
1 <= n <= 1,000,000,000。
說明:請注意這里的資料規模。
本題直接的想法是直接使用一個回圈來累加,然而,當資料規模很大時,這種“暴力”的方法往往會導致超時。此時你需要想想其他方法。你可以試一試,如果使用1000000000作為你的程式的輸入,你的程式是不是能在規定的上面規定的時限內運行出來。
本題另一個要值得注意的地方是答案的大小不在你的語言默認的整型(int)范圍內,如果使用整型來保存結果,會導致結果錯誤。
如果你使用C++或C語言而且準備使用printf輸出結果,則你的格式字串應該寫成%I64d以輸出long long型別的整數。
這是我的代碼,為什么用Visual C++編譯出結果不對,用藍橋杯測驗系統顯示運行超時,其他正確?
#include <stdio.h>
int main()
{
long long x,f=0,i;
scanf("%ld",&x);
for(i=1;i<=x;i++)
f=f+i;
printf("%I64d\n",f);
return 0;
}
uj5u.com熱心網友回復:
這不是說得很清楚了么本題直接的想法是直接使用一個回圈來累加,然而,當資料規模很大時,這種“暴力”的方法往往會導致超時。此時你需要想想其他方法。你可以試一試,如果使用1000000000作為你的程式的輸入,你的程式是不是能在規定的上面規定的時限內運行出來。
用高斯公式f = (1+n)*n/2
uj5u.com熱心網友回復:
應該有計算公式,暫時沒想起來,暴力也可以
#include <stdio.h>
int main(void) {
unsigned long long n;
scanf("%ull", &n);
unsigned long long result = 0;
while (n >= 1) {
result += n;
n--;
}
printf("%ull", result);
return 0;
}
uj5u.com熱心網友回復:
還是用樓上大佬的公式吧,暴力太慢了,而且我看著這答案不太對勁uj5u.com熱心網友回復:
編譯時,出現錯誤 error C2632: 'long' followed by 'long' is illegaluj5u.com熱心網友回復:
Visual C++太老了~~~,可能并不支持開long long,一般ll肯定沒問題,你看我這ulluj5u.com熱心網友回復:
int main(){
long long x,f=0,i;
scanf("%ld",&x);
f = n*(1+n)/2;
printf("%I64d\n",f);
return 0;
}
用不用unsigned 無所謂的。 long 后面 跟long非法,是你的printf函式給出的吧。
uj5u.com熱心網友回復:
printf怎么修改呀,long long非法,可是在藍橋杯測評系統中是正確的uj5u.com熱心網友回復:
你拿dev C++試試,不行的話vs肯定支持,最新版本的mingw就gcc肯定是支持的,這多半編譯器版本問題,改printf那是在改庫函式,還是省省吧,還不如自己寫個輸出函式
uj5u.com熱心網友回復:
printf("%I64d\n",f); 前面自己的測驗代碼里面不是有嗎?uj5u.com熱心網友回復:
謝謝啦
uj5u.com熱心網友回復:
printf("%ull", result);這里的ull應該用llu或者lld,ull只適用于數字字面值后綴uj5u.com熱心網友回復:
直接寫的話肯定會超時,你知道1加到50那個故事吧,他不是一個一個加起來的,而是首尾加乘個數的一半,這樣就不會超了唄uj5u.com熱心網友回復:
#include<stdio.h>int main()
{int i,n,s=0;
printf("enter n=?\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
s+=i;
printf("s=%d",s);
return 0;
}
uj5u.com熱心網友回復:
這題目考的是梯形面積為上底加下底乘以高除以二。
#include<stdio.h>
int main()
{
unsigned long long n = 0,s=0;
printf("enter n=?\n");
scanf("%I64u",&n);
printf("s=%I64u",(1+n)*n/2);
return 0;
}
/*
enter n=?
1000000000
s=500000000500000000
*/
uj5u.com熱心網友回復:
可以用等引數列求和的方法uj5u.com熱心網友回復:
還可以用遞回的方法,我經常用,哈哈哈,給你寫個例子uj5u.com熱心網友回復:
include "stdio.h"void main(){
long m=0;
scanf("%d",&m);
long n=sum(m);
printf("所求和為:%d\n",m)
}
int sum(long n) {
if(n==0) {
return 0;
}else {
return sum(n-1)+n;
}
}
uj5u.com熱心網友回復:
快一年多沒寫c了,大致原理是這樣的uj5u.com熱心網友回復:
迭代都超時,遞回絕對超時,而且int型別長度不夠,最好直接用公式計算
uj5u.com熱心網友回復:
對了,是long不夠,long long勉強,unsigned long long是夠了uj5u.com熱心網友回復:
#include<bits/stdc++.h>using namespace std;
int main(){
int a;
cin>>a;
cout<<(a+1)*a/2<<endl;
}
uj5u.com熱心網友回復:
用long long試一下,不行的話再試試其他轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/130880.html
標籤:C++ 語言
下一篇:有個小問題
