4.2 多重循环

例 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;
}
上一篇:For循环结构的使用


下一篇:3.2