1170:计算2的N次方
任意给定一个正整数N(N<=100),计算2的n次方的值。
#include<bits/stdc++.h>
int a[100000];
int main()
{
int n=0;
scanf("%d",&n);
a[1]=1;
int k = 1;
for(int i = 1; i <= n; ++i)
{
int x=0;
for(int j = 1; j <=k; ++j)
{
a[j] = a[j]*2+x;
x = a[j]/10;
a[j] = a[j]%10;
if(x!=0 && j==k) k++;//计算到最高位并且有进位,长度加1
}
}
for(int i = k; i >= 1; --i) printf("%d",a[i]);
return 0;
}
1172:求10000以内n的阶乘
#include<bits/stdc++.h>
int a[100000];
int main()
{
int n=0;
scanf("%d",&n);
a[1]=1;
int k = 1;
for(int i = 1; i <= n; ++i)
{
int x=0;
for(int j = 1; j <=k; ++j)
{
a[j] = a[j]*i+x;
x = a[j]/10;
a[j] = a[j]%10;
if(x!=0 && j==k) k++;//计算到最高位并且有进位,长度加1
}
}
for(int i = k; i >= 1; --i) printf("%d",a[i]);
return 0;
}
1173:阶乘和
用高精度计算出S=1!+2!+3!+…+n!(n≤100),其中“!”表示阶乘,例如:5!=5×4×3×2×1。
输入正整数n,输出计算结果S。
#include<bits/stdc++.h>
using namespace std;
int s[10000],a[10000],n;
//阶乘n!
void mul(int x){
memset(a,0,sizeof(a));
a[1]=1;//1!=1;
int k=1;//(i-1)!最高位数
for(int i=1;i<=x;i++){
int t=0;//进位
for(int j=1;j<=k;j++){
a[j]=a[j]*i+t;
t=a[j]/10;
a[j]%=10;
if(t!=0 && j==k) k++;
}
}
a[0]=k;
}
void add(){
int w=0;
if(s[0]<a[0]){
s[0]=a[0];
}
for(int i=1;i<=s[0];i++){
s[i]+=a[i]+w;
w=s[i]/10;
s[i]%=10;
}
if(w!=0){
s[0]++;
s[s[0]]=w;
}
}
void mprint(){
for(int i=s[0];i>=1;i--){
cout<<s[i];
}
cout<<endl;
}
int main(){
cin>>n;
s[0]=1;//起始长度
s[1]=0;
// mul(n);
// mprint();
for(int i=1;i<=n;i++){
mul(i);
add();
}
mprint();
return 0;
}
1171:大整数的因子
【题目描述】
已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。
【输入】
一个非负整数c,c的位数≤30。
【输出】
若存在满足 c%k == 0 的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。
【输入样例】
30
【输出样例】
2 3 5 6
#include<iostream>
#include<cstring>
using namespace std;
int a[50],b[50];
char str[50];
int divide(int x)//高精除
{
int i=a[0],res=0;
while(i>0)
{
res*=10;
res+=a[i];
res%=x;
i--;
}
return res;
}
int main()
{
int len;
bool flag=false;
int i;
cin>>str;
len=strlen(str);
int k=1;
for(i=len-1;i>=0;i--)//数据处理
{
a[k]=str[i]-'0';
k++;
}
a[0]=len;
for(i=2;i<=9;i++)
{
if(divide(i)==false)//判断是否能整除,可以就输出
{
flag=true;
cout<<i<<" ";
}
}
if(flag==false)
cout<<"none"<<endl;
return 0;
}
1175:除以13
【题目描述】
输入一个大于0的大整数N,长度不超过100位,要求输出其除以13得到的商和余数。
【输入】
一个大于0的大整数,长度不超过100位。
【输出】
两行,分别为整数除法得到的商和余数。
【输入样例】
2132104848488485
【输出样例】
164008065268345
0
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int a[110];
char str[110];
int len;
int i,k=0,b=0,c;
cin>>str;
len=strlen(str);
for(i=len-1;i>=0;i--)
a[++k]=str[i]-'0';
a[0]=len;
i=a[0];//首项处理
while(b<13)
{
b*=10;
b+=a[i];
i--;
}
cout<<b/13;
b%=13;
c=b;
while(i>=1)//高精除
{
b*=10;
b+=a[i];
i--;
cout<<b/13;
b%=13;
c=b;
}
cout<<endl;
cout<<c<<endl;
return 0;
}
求2+22+222+…+222….*2
题目描述
求2+22+222+…+222…*2的和是多少?最后一项有多少2相乘由键盘读入的n决定(1<=n<=100)!
比如:n=3,那么s=2+22+22*2=14!
输入
从键盘读入一个整数n(1<=n<=100)
输出
输出求出的和
样例
输入复制
3
输出复制
14
#include<bits/stdc++.h>
using namespace std;
int a[100]={1};
int r[1000];
int i,j,k=1,n,k2=1,len;
int main(){
cin>>n;
for(i=1;i<=n;i++){
for(j=0;j<k;j++){
a[j]=a[j]*2;
}
//进位
for(j=0;j<k;j++){
if(a[j]>=10){
a[j+1]+=a[j]/10;
a[j]=a[j]%10;
}
}
if(a[k]!=0){
k++;
}
len=k;
if(k2>k) len=k2;
for(j=0;j<len;j++){
r[j]=r[j]+a[j];
if(r[j]>=10){
r[j+1]+=r[j]/10;
r[j]%=10;
}
}
if(r[k2]!=0){
k2++;
}
}
for(i=k2-1;i>=0;i--){
cout<<r[i];
}
return 0;
}
棋盘里的麦子?
题目描述
传说西塔发明了国际象棋而使国王十分高兴,他决定要重赏西塔,西塔说:“我不要你的重赏 ,陛下,只要你在我的棋盘上赏一些麦子就行了。在棋盘的第1个格子里放1粒,在第2个格子里放2粒,在第3个格子里放4粒,在第4个格子里放8粒,依此类推,以后每一个格子里放的麦粒数都是前一个格子里放的麦粒数的2倍,直到放满第64个格子就行了”。“区区小数,几粒麦子,这有何难,来人”,国王令人如数付给西塔。
计数麦粒的工作开始了,第一格内放1粒,第二格内放2粒第三格内放4粒,…还没有到第二十格,一袋麦子已经空了。一袋又一袋的麦子被扛到国王面前来。但是,麦粒数一格接一格飞快增长着,国王很快就看出,即便拿出全国的粮食,也兑现不了他对西塔的诺言。
请你编程帮助国王计算出,第n个棋盘格子中需要放多少粒麦子?
输入
一个整数N代表第n格棋盘(n<=100)
输出
一个整数,代表第n格棋盘中麦子的总数。
样例
输入复制
3
输出复制
4
评论区