题目
知识点
Python打表
sum=0
fact=1
i=1
n=int(input())
while i<n:
fact*=i
sum+=fact #end=""避免换行
print('"',end="")#分开输出避免空格,python默认所有对象间都有空格
print(sum,end="")#或者使用sep="",使用字符串""中的内容代替空格
print('",',end="")#等价于print('"',sum,'",',sep='',end="")
i+=1
C++大数和差运算
const int L = 110; //最多110位相加
string add(string a, string b)//两个非负整数相加
{
string ans; //定义答案字符串(string类使用cin读入时遇空格视为结束)
int na[L] = { 0 }, nb[L] = { 0 };//初始化两个数组
int la = a.size(), lb = b.size();//取得数组长度
for (int i = 0; i < la; i++)na[la - 1 - i] = a[i] - '0';//倒置字符串存储与整型数组
for (int i = 0; i < lb; i++)nb[lb - 1 - i] = b[i] - '0';//字符转整数-'0'
int lmax = la > lb ? la : lb; //记录两字符串得最大长度
for (int i = 0; i < lmax; i++)na[i] += nb[i], na[i + 1] += na[i] / 10, na[i] %= 10;//整型数组求和,从低到高,此位超十则下一加一
if (na[lmax])lmax++; //如果最长的长度进了一,则长度加一
for (int i = lmax - 1; i >= 0; i--)ans += na[i] + '0'; //倒转整型数组赋值给字符串ans,+=是string字符串运算符,作用是连接字符串(整数转字符+'0')
return ans;
}
#include<bits/stdc++.h>
using namespace std;
const int L = 110; //最多110位相减
string sub(string a, string b)//两个非负整数相减(大数减小数)
{
string ans; //答案字符串
int na[L] = { 0 }, nb[L] = { 0 };//存储数字的数组
int la = a.size(), lb = b.size();//获取字符串长度
for (int i = 0; i < la; i++)na[la - i - 1] = a[i] - '0';
for (int i = 0; i < lb; i++)nb[lb - i - 1] = b[i] - '0';//倒转字符串为数字
int lmax = la > lb ? la : lb; //记录最大长度
for (int i = 0; i < lmax; i++)//倒转相减
{
na[i] -= nb[i];//各位先减
if (na[i] < 0)na[i] += 10, nb[i + 1] -= 1;//再看需不需要补
}
while (!na[--lmax] && lmax > 0); lmax++;//忽略掉开始前导零的段落(lmax>0为了至少有一位0,即相等相减时)
for (int i = lmax - 1; i >= 0; i--)ans += na[i] + '0';//为了统一格式,上文lmax原本就是数字,lmax++就为前导零,lmax-1就是第一个数字
return ans;//返回答案数字字符串 //逆转转换为字符串+'0'
}
C++大数乘法运算
string mul(string a, string b)//两个非负整数相承
{
string ans;//存储答案的数组
int na[L], nb[L], nc[L], la = a.size(), lb = b.size();//变量
fill(na, na + L, 0); fill(nb, nb + L, 0); fill(nc, nc + L, 0);//初始化数组
for (int i = la - 1; i >= 0; i--)na[la - i ] = a[i] - '0';//从1开始赋值直到la
for (int i = lb - 1; i >= 0; i--)nb[lb - i ] = b[i] - '0';
for (int i = 1; i <= la; i++)//从第一位开始
for (int j = 1; j <= lb; j++)//乘以对方每一位
nc[i + j - 1] += na[i] * nb[j];//a的第i位乘以b的第j位为积的第i+j-1位(注意是+=,因为其他位运算也会影响此位)
for (int i = 1; i <= la + lb; i++)
nc[i + 1] += nc[i] / 10, nc[i] %= 10;//统一进位!
if (nc[la + lb])ans += nc[la + lb] + '0';//运算时i+j-1则最高位为la+lb-1,可能进一位到la+lb
if (a == "0" || b == "0")la = 2, lb = 0;
for (int i = la + lb - 1; i >= 1; i--) //再倒转存入ans数组(ans+=,从尾开始即可)
ans += nc[i] + '0';
return ans;//返回运算结果
}
解题代码
包含知识:字符中的数字
#include<bits/stdc++.h>
using namespace std;
const int L = 110000; //最多110位相乘
string mul(string a, string b)//两个非负整数相承
{
string ans;//存储答案的数组
int na[L], nb[L], nc[L], la = a.size(), lb = b.size();//变量
fill(na, na + L, 0); fill(nb, nb + L, 0); fill(nc, nc + L, 0);//初始化数组
for (int i = la - 1; i >= 0; i--)na[la - i ] = a[i] - '0';//从1开始赋值直到la
for (int i = lb - 1; i >= 0; i--)nb[lb - i ] = b[i] - '0';
for (int i = 1; i <= la; i++)//从第一位开始
for (int j = 1; j <= lb; j++)//乘以对方每一位
nc[i + j - 1] += na[i] * nb[j];//a的第i位乘以b的第j位为积的第i+j-1位(注意是+=,因为其他位运算也会影响此位)
for (int i = 1; i <= la + lb; i++)
nc[i + 1] += nc[i] / 10, nc[i] %= 10;//统一进位!
if (nc[la + lb])ans += nc[la + lb] + '0';//运算时i+j-1则最高位为la+lb-1,可能进一位到la+lb
for (int i = la + lb - 1; i >= 1; i--) //再倒转存入ans数组(ans+=,从尾开始即可)
ans += nc[i] + '0';
return ans;//返回运算结果
}
string add(string a, string b)//两个非负整数相加
{
string ans; //定义答案字符串(string类使用cin读入时遇空格视为结束)
int na[L] = { 0 }, nb[L] = { 0 };//初始化两个数组
int la = a.size(), lb = b.size();//取得数组长度
for (int i = 0; i < la; i++)na[la - 1 - i] = a[i] - '0';//倒置字符串存储与整型数组
for (int i = 0; i < lb; i++)nb[lb - 1 - i] = b[i] - '0';//字符转整数-'0'
int lmax = la > lb ? la : lb; //记录两字符串得最大长度
for (int i = 0; i < lmax; i++)na[i] += nb[i], na[i + 1] += na[i] / 10, na[i] %= 10;//整型数组求和,从低到高,此位超十则下一加一
if (na[lmax])lmax++; //如果最长的长度进了一,则长度加一
for (int i = lmax - 1; i >= 0; i--)ans += na[i] + '0'; //倒转整型数组赋值给字符串ans,+=是string字符串运算符,作用是连接字符串(整数转字符+'0')
return ans;
}
int main()
{
while (1) {
string sum, fact, c;//大数运算转换为字符串运算
int n;
cin >> n;
fact = "1";//fact计算阶乘
sum = "0"; //sum记录和值(都是字符串化的"数字")
for (int i = 1; i <= n; i++)
{
int t = i;
c = "";//初始化c
while (t > 0)//由于i可能有多位,所以要转换为字符串
c += t % 10+'0', t /= 10;//数字+'0'才是字符中对应的数字(以便显示)
for (int j = 0; j < c.size()/2; j++)
swap(c[j],c[c.size() - j - 1]);//逆转数组
fact = mul(fact, c); //求阶乘
sum = add(fact, sum);//求和
}
cout << sum << endl;
}
return 0;
}