7-61 打印沙漏
很强的对称性原理 如果内部基于第一个循环 将第一个循环反过来
#include <bits/stdc++.h> using namespace std; int aaa(int n); int main() { int n;char x; cin>>n>>x; int t=(n-1)/2; int left=n-1-( (3+aaa(t))*((aaa(t)-3)/2+1) ); int q=aaa(t); if(q==1) {printf("%c",x);printf(" %d",left);return 0;} else { for(int i=1;i<=q/2+1;i++) { for(int s=1;s<i;s++)printf(" "); for(int j=q;j>=(i-1)*2+1;j--) printf("%c",x); printf(" "); } for(int i=q/2;i>=1;i--) { for(int s=1;s<i;s++)printf(" "); for(int j=q;j>=(i-1)*2+1;j--) printf("%c",x); if(i!=1) printf(" "); } printf(" %d",left); } return 0; } int aaa(int n) { for(int i=3;;i++,i++) { if( ((3+i)*((i-3)/2+1)/2)>n )return i-2; } }
清晰的思路
#include<iostream> #include<cmath> using namespace std; int main() { int k=0,i,j,n; char c; cin>>n>>c; while(1) { if((2*pow(k+1,2)-1)>n) break; else k++; } for(i=k-1;i>0;i--) { for(j=1;j<=(k-1-i);j++) cout<<" "; for(j=1;j<=(2*i+1);j++) cout<<c; cout<<endl; } for(i=0;i<=k-1;i++) { for(j=1;j<=(k-1-i);j++) cout<<" "; for(j=1;j<=(2*i+1);j++) cout<<c; cout<<endl; } //cout<<k-1<<endl; cout<<(n-2*pow(k,2)+1)<<endl; return 0; }
7-65 连续因子
数学 枚举
#include <bits/stdc++.h> using namespace std; int main() { int n;cin>>n; int max1=0,flag=2; for(int i=2;i<=sqrt(n);i++) { int j=1; for(int k=i;j*k<=n;k++) { j*=k; if(n%j==0&&(k-i+1)>max1){max1=k-i+1;flag=i;} else if(n%j!=0){break;} } } if(max1==0)printf("1 %d",n); else { printf("%d ",max1); for(int i=flag;i<=flag+max1-1;i++) { if(i==flag)printf("%d",i); else printf("*%d",i); } } return 0; }