例 4-6
数字直角三角形(洛谷P5712)。
给出 n(1≤n≤13),请输出一个直角边长度是 n 的数字直角三角形。所有数字都是 2 位组成的,如果没有 2 位则加上前导 0。
输入输出样例
输入 | 输出 |
---|---|
5 |
0102030405 06070809 101112 1314 15
|
解答
解法一
#include<bits/stdc++.h>
using namespace std;
int n,c=1;
int main()
{
cin>>n;
for(int i=n;i>0;i--)
{
for(int j=0;j<i;j++)
{
//if(c<10)
// cout<<0;
//cout<<c;
cout<<setfill('0')<<setw(2)<<c;
c++;
}
cout<<endl;
}
return 0;
}
备注
本题可以用到 setw() 函数和 setfill() 函数,setw():设置域宽,setfill():设置填充符号。
解法二
数据不大,直接输出
#include <bits/stdc++.h>
using namespace std;
int n;
int main(){
cin>>n;
if(n==1){
cout<<"01\n";
}
else if(n==2){
cout<<"0102\n03\n";
}
else if(n==3){
cout<<"010203\n0405\n06\n";
}
else if(n==4){
cout<<"01020304\n050607\n0809\n10\n";
}
else if(n==5){
cout<<"0102030405\n06070809\n101112\n1314\n15\n";
}
else if(n==6){
cout<<"010203040506\n0708091011\n12131415\n161718\n1920\n21\n";
}
else if(n==7){
cout<<"01020304050607\n080910111213\n1415161718\n19202122\n232425\n2627\n28\n";
}
else if(n==8){
cout<<"0102030405060708\n09101112131415\n161718192021\n2223242526\n27282930\n313233\n3435\n36\n";
}
else if(n==9){
cout<<"010203040506070809\n1011121314151617\n18192021222324\n252627282930\n3132333435\n36373839\n404142\n4344\n45\n";
}
else if(n==10){
cout<<"01020304050607080910\n111213141516171819\n2021222324252627\n28293031323334\n353637383940\n4142434445\n46474849\n505152\n5354\n55\n";
}
else if(n==11){
cout<<"0102030405060708091011\n12131415161718192021\n222324252627282930\n3132333435363738\n39404142434445\n464748495051\n5253545556\n57585960\n616263\n6465\n66\n";
}
else if(n==12){
cout<<"010203040506070809101112\n1314151617181920212223\n24252627282930313233\n343536373839404142\n4344454647484950\n51525354555657\n585960616263\n6465666768\n69707172\n737475\n7677\n78\n";
}
else if(n==13){
cout<<"01020304050607080910111213\n141516171819202122232425\n2627282930313233343536\n37383940414243444546\n474849505152535455\n5657585960616263\n64656667686970\n717273747576\n7778798081\n82838485\n868788\n8990\n91\n";
}
return 0;
}
例 4-7
阶乘之和(洛谷P1009,NOIP普及组1998)
用高精度计算出 S=1!+2!+3!+⋯+n!(n≤20)。
其中“!”表示阶乘,例如:5!=5×4×3×2×1。
输入格式
一个正整数 nn。
输出格式
一个正整数 SS,表示计算结果。
输入输出样例
输入 | 输出 |
---|---|
3 |
9 |
解答
#include<bits/stdc++.h>
using namespace std;
long long n,s,k;
int main()
{
s=0;
cin>>n;
for(int i=1;i<=n;i++)
{
k=1;
for(int j=1;j<=i;j++)
{
k*=j;
}
s+=k;
}
cout<<s;
return 0;
}
例 4-8
计数问题(洛谷P1980,NOIP2013普及组)
试计算在区间 1 到 n 的所有整数中,数字 x(0≤x≤9) 共出现了多少次?
例如,在 1到11中,即在 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 出现了 4 次。
输入格式
2个整数n,x,之间用一个空格隔开。
输出格式
1个整数,表示x出现的次数。
输入输出样例
输入 | 输出 |
---|---|
11 1 |
4 |
解答
建模分析
分析N个数字里面有什么数字,即需求出每位数的数字,例如一个百位数 123,得求出 百位数 1,十位数 2,个位数 3,然后再和x比较。
求各个位上的数,取余是不二法门。
解法一
#include<iostream>
using namespace std;
int n,x,c;
int main()
{
c=0;
cin>>n>>x;
for(int i=1;i<=n;i++)
{
if(i==10000000&&x==1) c++;
if(i>=1000000&&i%10000000/1000000==x) c++;
if(i>=100000&&i%1000000/100000==x) c++;
if(i>=10000&&i%100000/10000==x) c++;
if(i>=1000&&i%10000/1000==x) c++;
if(i>=100&&i%1000/100==x) c++;
if(i>=10&&i%100/10==x) c++;
if(i>=1&&i%10==x) c++;
}
cout<<c;
return 0;
}
解法二
#include<iostream>
using namespace std;
int main()
{
int n,x,ans=0;
cin>>n>>x;
for(int i=1;i<=n;i++)
{
int tmp=i,num;
while(tmp!=0)
{
num=tmp%10; //求个位数的数字
if(num==x)
ans++;
tmp /= 10; //整数除10,即去掉个位数,十位数掉落成为个位数
}
}
cout<<ans;
return 0;
}