P5718 【深基4.例2】找最小值
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int i = 0;
int num = 0;
int min = 1000;
for(i=0; i<n; i++)
{
cin >> num;
if(num < min)
{
min = num;
}
}
cout << min;
return 0;
}
这题这样是简单高效的方法。
P5719 【深基4.例3】分类平均
#include <iostream>
using namespace std;
int main()
{
int n = 0, k = 0;
cin >> n >> k;
int i = 0;
int sum1 = 0, sum2 = 0;
int count1 = 0, count2 = 0;
for(i=1; i<=n; i++)
{
if(i%k == 0)
{
sum1 += i;
count1++;
}
else
{
sum2 += i;
count2++;
}
}
printf("%.1f %.1f\n", sum1*1.0/count1, sum2*1.0/count2);
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int n = 0, k = 0;
int sum = 0;
cin >> n >> k;
int i = 0;
for(i=k; i<=n; i+=k)
{
sum += i;
}
printf("%.1f ", sum*1.0/(n/k));
sum = n*(1+n) / 2 - sum;
printf("%.1f\n", sum*1.0/(n-n/k));
return 0;
}
2法,被k整除,即为k的倍数。和可以用高斯求和再减。
P5720 【深基4.例4】一尺之棰
#include <iostream>
using namespace std;
int a, day = 1;
int main()
{
cin >> a;
while(a != 1)
{
a /= 2;
day++;
}
cout << day;
return 0;
}
声明全局也可以赋初值。
#include <iostream>
using namespace std;
int a, day = 1;
int main()
{
cin >> a;
while(a != 1)
{
a >>= 1;
day++;
}
cout << day;
return 0;
}
也可以用右移代替除2的操作。
P5721 【深基4.例6】数字直角三角形
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int i = 0;
int j = 0;
int num = 1;
for(i=0; i<n; i++)
{
for(j=0; j<n-i; j++)
{
printf("%02d", num++);
}
cout << '\n';
}
return 0;
}
这题解方法真是千奇百怪,还是用这个吧,定义一个num用完后自加。
P1009 [NOIP1998 普及组] 阶乘之和
这题暂放
P1980 [NOIP2013 普及组] 计数问题
#include <iostream>
using namespace std;
int main()
{
int n = 0, x = 0;
cin >> n >> x;
int i = 0;
int count = 0;
int tmp = 0;
for(i=1; i<=n; i++)
{
tmp = i;
while(tmp)
{
if(tmp%10 == x)
{
count++;
}
tmp /= 10;
}
}
cout << count << '\n';
return 0;
}
P1035 [NOIP2002 普及组] 级数求和
我的
#include <iostream>
using namespace std;
int main()
{
int k = 0;
cin >> k;
int n = 1;
double sum = 0.0;
while(sum <= k)
{
sum += 1.0/n;
n++;
}
cout << n-1 << endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int k = 0;
cin >> k;
int n = 0;
double sum = 0.0;
for(; sum<=k; ++n, sum+=1.0/n)
;
cout << n;
return 0;
}
或者这样,注意两者区别++n和n++。
P2669 [NOIP2015 普及组] 金币
#include <iostream>
using namespace std;
int main()
{
int k = 0;
cin >> k;//k为总天数
int i = 0;
int j = 0;
int n = 0;
int sum = 0;
for(i=1; ; i++)
{
for(j=1; j<=i; j++)
{
if(n < k)
{
sum += i;
n++;
}
else
{
cout << sum;
return 0;
}
}
}
return 0;
}
首先第一个循环因为不知道天数中每天的金币中加到多少,所以中间为空,代表每天的金币数,第二个循环表示之后的天数,n为天数,比总天数k小时,加到和中,n多一天,否则n>=k时输出sum,并及时退出。
P5722 【深基4.例11】数列求和
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int i = 0;
int sum = 0;
for(i=1; i<=n; i++)
{
sum += i;
}
cout << sum;
return 0;
}
O(1)
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int i = 0;
int sum = 0;
sum = n*(1+n) / 2;
cout << sum;
return 0;
}
P5723 【深基4.例13】质数口袋
#include <iostream>
using namespace std;
int main()
{
int L = 0;
cin >>L;
int i = 0;
int sum = 0;
int j = 0;
int count = 0;
for(i=2; ;i++)
{
for(j=2; j<=i/2; j++)
{
if(i % j == 0)
{
break;
}
}
if(j > i/2)
{
sum += i;
if(sum > L)
{
break;
}
cout << i << '\n';
count++;
}
}
cout << count;
return 0;
}
注意,sum==l时也满足,所以不要忘了输出。
[USACO1.5]回文质数 Prime Palindromes
暂放
小玉在游泳
#include <iostream>
using namespace std;
int main()
{
double n = 0.0;
cin >> n;
int count = 0;
double sum = 0.0;
double step = 2.0;
while(sum < n)
{
sum += step;
step *= 0.98;
count++;
}
cout << count;
return 0;
}
[NOIP2011 普及组] 数字反转
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int ans = 0;
while(n)
{
ans = ans*10 + n%10;
n /= 10;
}
cout << ans;
return 0;
}
注意负号是没有影响的,比如-324%10=-320+(-4) = 余数-4。
P1720 月落乌啼算钱(斐波那契数列)
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n = 0;
cin >> n;
double ans = 0.0;
double n1 = 0.0, n2 = 0.0;
n1 = pow(((1+sqrt(5)) / 2), n);
n2 = pow(((1-sqrt(5)) / 2), n);
ans = (n1-n2) / sqrt(5);
printf("%.2f\n", ans);
return 0;
}
P5724 【深基4.习5】求极差 / 最大跨度值
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int i = 0;
int num = 0;
int max = 0;
int min = 1000;
for(i=0; i<n; i++)
{
cin >> num;
if(num > max)
{
max = num;
}
if(num < min)
{
min = num;
}
}
cout << max-min << endl;
return 0;
}
也可以用C++自带的函数
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int i = 0;
int num = 0;
int Max = 0;
int Min = 1000;
for(i=0; i<n; i++)
{
cin >> num;
Max = max(num, Max);
Min = min(num, Min);
}
cout << Max-Min << endl;
return 0;
}
P1420 最长连号
#include <iostream>
using namespace std;
int n, num1, i, num2, countt = 1, maxx = 1;
int main()
{
cin >> n >> num1;
for (i = 2; i <= n; i++)
{
cin >> num2;
if (num2 > num1 && num2 - 1 == num1)
{
countt++;
}
else
{
countt = 1;
}
if (countt > maxx)
{
maxx = countt;
}
num1 = num2;
}
cout << maxx << endl;
return 0;
}
在我试着用全局声明变量时发现一个错误,即不能与库函数冲突,大家也要注意!
P1075 [NOIP2012 普及组] 质因数分解
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int i = 0;
for(i=2; i<=n/2; i++)
{
if(n%i == 0)
{
cout << n/i << endl;
break;
}
}
return 0;
}
这题主要是审题意,正整数n是两个不同的质数的乘积。所以只要从2开始,假设能被x整除,然后一个数能被x整除,那么被n/x也能整除。
P5725 【深基4.习8】求三角形
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int i = 0;
int j = 0;
int num = 1;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
printf("%02d", i*n+j+1);
}
cout << '\n';
}
cout << '\n';
for(i=0; i<n; i++)
{
for(j=0; j<n-i-1; j++)
{
cout << " ";
}
for(j=0; j<=i; j++)
{
printf("%02d", num++);
}
cout << '\n';
}
return 0;
}
这边直接用%02d非常方便。
P5726 【深基4.习9】打分
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int i = 0;
int sum = 0;
int num = 0;
int Max = 0;
int Min = 10;
for(i=0; i<n; i++)
{
cin >> num;
Max = max(num, Max);
Min = min(num, Min);
sum += num;
}
sum -= Max + Min;
printf("%.2f\n", sum*1.0/(n-2));
return 0;
}
注意无论是double型的还是float型的,输出的占位符都为%f,没有%lf这一说。
P4956 [COCI2017-2018#6] Davor
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
n /= 52*7;
if(n <= 103)
{
cout << n-3 << endl << 1;
}
else if(n%3 == 0)
{
cout << 99 << endl << (n-99)/3;
}
else if(n%3 == 1)
{
cout << 100 << endl << (n-100)/3;
}
else if(n%3 == 2)
{
cout << 98 << endl << (n-98)/3;
}
return 0;
}
注意这边要分两种一个是n<=103时,这种不管什么n%3是什么情况都是n-3,而别一种需要讨论。
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int k = 1;
int x = 0;
while(1)
{
for(x=100; x>=1; x--)
{
if(52*7*(x+3*k) == n)
{
cout << x << endl << k;
return 0;
}
}
k++;
}
return 0;
}
x有范围可以一个个比较,如果不成立则将k自加。
P1089 [NOIP2004 提高组] 津津的储蓄计划
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
int main()
{
int m = 0;
int i = 0;
int cost = 0;
int save = 0;
for (i = 0; i < 12; i++)
{
m += 300;
cin >> cost;
m -= cost;
if (m < 0)
{
cout << -(i + 1) << endl;
return 0;
}
if (m / 100)
{
save += m / 100 * 100;
}
m = m % 100;
}
cout << m + save * 1.2;
return 0;
}
这题我有两个错误,1是题意没看清,钱少于0输出的是月份,2是我原先给钱是最后给300,到12月的时候给了13个月的钱,所以一直没对。