- 论坛徽章:
- 0
|
5可用积分
只是简单学习C++,但我是从来没有学过ACM的,因此问的问题可能很可笑,所以还请多多包涵.......
据说著名数学家高斯小时候通过仔细观察发现 1 + 2 + 3 + ... + 99 + 100 的值是 5050. 本题对于给定的正整数 n, 请计算 1 + 2 + 3 + ... + (10^n-1) + 10^n 的值.
Input
有多个测试用例. 每个测试用例是一个不超过 100000 的正整数 n. 输入直至没有数据为止.
Output
在一行上输出 1 到 10n 的累加和.
Sample Input
1
2
Sample Output
55
5050
下面是我的程序,程序可以运行,结果也对。但问题在于测试用例,我设计得不合理。但不知道如何改.......
#include<iostream>
using namespace std;
int main()
{
int m;
int sum=1,k;//用整型去定义sum是不对的,考虑过字符型,但对它的使用不熟悉.....
while(cin>>m)
{
for(int i=0;i<m;i++)
{
sum*=10;
}
k=(1+sum)*sum/2;
}
cout<<k<<endl;
return 0;
}
在 n 个相异物品中选出 k 个物品的方法数叫做组合数, 记为 C(n,k). 这个数有一个简洁的公式: n!/(k!(n-k)!). 利用这个公式立即有 C(n,k) = C(n,n-k). 遗憾的是, 这个公式并不方便用于计算. 组合数有许多计算方法, 利用分数可以递推地计算:
C(n,k) = (n/k)*C(n-1,k-1), 其中 0 < k ≤ n, C(n,0) = 1.
也就是
C(n,k) = (n/k)*(n-1/k-1)*...*((n-k+2)/2)*((n-k+1)/1)
本题对于给定的 n, k, 请计算 C(n,k).
Input
有多个测试用例. 每个测试用例是两个整数 n, k ( 0 ≤ k ≤ n < 231), 且 n > 0. 输入直至没有数据为止.
Output
对于每个测试用例, 在一行上输出 C(n,k). 你可以假设这个数小于 264.
Sample Input
1000000000 0
163 5
Sample Output
1
901289592
我编写的程序是
#include<iostream>
using namespace std;
int main()
{
int n,k;
int sum=1,m=1; int comm(int n,int k);
while(cin>>n>>k)
{cout<<comm(n,k)<<endl;}
system("pause");
return 0;
}
int comm(int n,int k)
{
for(int n;n>k;n--)//计算n(n-1)....(n-k+1)
{ sum*=n;}
for(int t=1;t<k+1;t++)//计算k的阶乘
{ m*=t;}
return sum/m;
}
程序的算法不对,因为我得到的答案总是0;还有测试用例也不对,我对测试用例感到很困惑。
望朋友指点!
[ 本帖最后由 中国可爱小牛 于 2009-5-24 16:37 编辑 ] |
|