P1009 [NOIP 1998 普及组] 阶乘之和
高精度乘法与高精度加法;按照运算的顺序来
#include<iostream>
#include<cstdio>
using namespace std;
int n,a[101]={0},s[101]={0};
void do_jiecheng(int x)
{
int g=0;
for(int i=100;i>=0;i--)
//从末尾开始存,a[100]存的是个位数
{
a[i]=a[i]*x+g; //两位相乘+进位(刚开始进位为0)
g=a[i]/10; //修改进位
a[i]=a[i]%10; //取模
}
}
void jiecheng_add()
{
int g=0;
for(int i=100;i>=0;i--)
{
s[i]=s[i]+a[i]+g;
g=s[i]/10;
s[i]=s[i]%10;
}
}
void output()
{
int w;
for(int i=0;i<=100;i++)
{
if(s[i]!=0)
{
w=i;
break;
}
}
for(int i=w;i<=100;i++)
printf("%d",s[i]);
}
int main()
{
scanf("%d",&n);
s[100]=a[100]=1;
for(int i=2;i<=n;i++)
{
do_jiecheng(i);
jiecheng_add();
}
output();
return 0;
}
P1035 [NOIP 2002 普及组] 级数求和
【注意】浮点数除法要用“1.0”去除
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int i;
double sum=0;
for(i=1;;i++)
{
sum+=1.0/i; //注意这边是“1.0”
if(sum>n)
{
break;
}
}
cout<<i;
return 0;
}
P2669 [NOIP 2015 普及组] 金币
循环的嵌套
#include<bits/stdc++.h>
using namespace std;
int main()
{
int k;
cin>>k;
long sum=0;
int num=0;
for(int i=0;;i++)
{
for(int j=1;j<=i;j++)
{
sum+=i;
num++;
if(num=k)
{
cout<<sum;
return 0;
}
}
}
return 0;
}
P5723 【深基4.例13】质数口袋
质数的判断;vector容器的应用;输出
#include <bits/stdc++.h>
using namespace std;
bool isPrime(int n) {
if (n < 2) return false;
for (int j = 2; j * j <= n; j++) {
if (n % j == 0) return false;
}
return true;
}
int main() {
int L;
cin >> L;
if (L < 2) { // L == 1 或更小,不可能存入质数
cout << "0" << endl;
return 0;
}
int sum = 0, num = 0;
vector<int> primes; // 存储所有装入的质数
for (int i = 2; sum + i <= L; i++) { // 遍历所有可能的质数
if (isPrime(i)) {
sum += i;
primes.push_back(i);
num++;
}
}
for (int p : primes) {
cout << p << endl;
}
cout << num << endl; // 输出质数个数
return 0;
}
P1217 [USACO1.5] 回文质数 Prime Palindromes
一个一个生成回文数,再判断是否是质数
#include <iostream>
#include <cmath>
using namespace std;
bool prime(int x)
{
bool b=true;
for(int i=2;i<=sqrt(x);i++)
{
if(x%i==0)
b=false;
}
return b;
} //判断质数的函数
int main()
{
int a,b;
int c[100000];
int i=3;
int d1,d2,d3,d4,d5;
c[0]=5;
c[1]=7;
c[2]=11; //2位数和1位数只有这三个是回文质数
for(d1=1;d1<=9;d1+=2)
for(d2=0;d2<=9;d2++)
{
c[i]=d1*100+d2*10+d1;
i++;
} //生成3位回文数
for(d1=1;d1<=9;d1+=2)
for(d2=0;d2<=9;d2++)
for(d3=0;d3<=9;d3++)
{
c[i]=d1*10000+d2*1000+d3*100+d2*10+d1;
i++;
} //生成5位回文数
for(d1=1;d1<=9;d1+=2)
for(d2=0;d2<=9;d2++)
for(d3=0;d3<=9;d3++)
for(d4=0;d4<=9;d4++)
{
c[i]=d1*1000000+d2*100000+d3*10000+d4*1000+d3*100+d2*10+d1;
i++;
} //生成7位回文数
for(d1=1;d1<=9;d1+=2)
for(d2=0;d2<=9;d2++)
for(d3=0;d3<=9;d3++)
for(d4=0;d4<=9;d4++)
for(d5=0;d5<=9;d5++)
{
c[i]=d1*100000000+d2*10000000+d3*1000000+d4*100000+d5*10000+d4*1000+d3*100+d2*10+d1;
i++;
} //生成9位回文数
cin>>a>>b;//输入范围
for(int i=0;i<100000000;i++)
{
if(c[i]>=a && c[i]<=b && prime(c[i])==true)
{
cout<<c[i]<<endl;
} //判断回文数是否是质数
if(c[i]>b)
break; //当超出范围时及时退出循环
}
}
P1307 [NOIP 2011 普及组] 数字反转
(1)考虑负数——先输出符号,再取反;
(2)考虑0——直接输出;
(3)考虑1~9之间的数——直接输出;
(4)考虑其他数——先利用“%”和“/”,把每一位存入数组中;去除前导0;输出
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
int a[11]={0};
int i=0;
cin>>n;
if(n<0)
{
cout<<"-";
n=-n;
}
if(n==0)
{
cout<<0;
return 0;
}
if(n>0 && n<10)
{
cout<<n;
return 0;
}
else
{
while(n!=0)
{
a[i]=n%10;
n/=10;
i++;
}
}
int daff=0;
for(int j=0;j<i;j++)
{
if(a[j]==0 && a[j+1]!=0)
{
daff=j+1;
break;
}
}
for(int j=daff;j<i;j++)
{
cout<<a[j];
}
return 0;
}
另一种方法(更简单)
#include<bits/stdc++.h>
using namespace std;
int n,s=0;
int main()
{
cin>>n;
while(n)
{
s=s*10+n%10; //在s的末尾加一位
n/=10; //处理n
}
cout<<s;
return 0;
}
P1720 月落乌啼算钱(斐波那契数列)
斐波那契数列
#include<iostream>
using namespace std;
long long a=1,b=1,c=0;
int n,i;
int main()
{
cin>>n;
for (i=3;i<=n;i++)
{
c=a+b;
a=b;
b=c;
}
cout<<c<<".00";
return 0;
}
P1420 最长连号
【方法一】
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
int a[1010]={0};
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int num[1010]={0};
int j=0;
for(int i=0;i<n-1;i++)
{
if(a[i]+1==a[i+1])
{
num[j]++;
}
else
{
j++;
}
}
int max=num[0];
for(int i=0;i<=j;i++)
{
if(num[i]>max)
{
max=num[i];
}
}
cout<<max+1;
return 0;
}
【方法二】
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,x,y;
cin>>n>>x;
int num1=0,num2=1;
for(int i=1;i<n;i++)
{
cin>>y;
if(x+1==y)
{
num2++;
x=y;
}
else
{
if(num2>num1)
{
num1=num2;
num2=1;
}
x=y;
}
}
int maxn=max(num1,num2);
cout<<maxn;
return 0;
}
P1075 [NOIP 2012 普及组] 质因数分解
在2~i*i<n之间找到的是较小的质数
#include<bits/stdc++.h>
using namespace std;
bool isPrime(int x)
{
for(int i=2;i*i<=x;i++)
{
if(x%i==0)
return 0;
}
return 1;
}
int main()
{
int n;
cin>>n;
int p;
for(int i=2;i*i<=n;i++)
{
if(n%i==0 && isPrime(i)==true)
{
p=i;
break;
}
}
cout<<n/p;
return 0;
}
P5725 【深基4.习8】求三角形
循环嵌套
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int m=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<setfill('0')<<setw(2)<<m;
m++;
}
cout<<endl;
}
cout<<endl;
m=1;
int num=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n-i;j++)
{
cout<<" ";
}
for(int j=n-i+1;j<=n;j++)
{
cout<<setfill('0')<<setw(2)<<m;
m++;
}
cout<<endl;
}
return 0;
}
P5726 【深基4.习9】打分
double!!!
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a;
cin>>n>>a;
int sum=a;
int max=a;
int min=a;
for(int i=2;i<=n;i++)
{
cin>>a;
if(a>max)
{
max=a;
}
if(a<min)
{
min=a;
}
sum+=a;
}
sum-=max+min;
double ans=(double)sum/(n-2);
cout<<fixed<<setprecision(2)<<ans;
return 0;
}