编者的话:显示目录记得在最开始加上
暴力求解(第二章)
2.1枚举
1abc
#include <iostream>
using namespace std;
int main(){
int a,b,c;
/*
因为num1=a*100+b*10+c;num2=b*100+c*10+c;即两数之和为num=100*a+110*b+12*c;
*/
for(a=0;a<=9;a++){
for(b=0;b<=9;b++){
for(c=0;c<=9;c++){
if(100*a+110*b+12*c==532){
cout<<a<<" "<<b<<" "<<c<<endl;
}
}
}
}
return 0;
}
2反序数
#include <iostream>
using namespace std;
//求反序数
int reverse(int n){
int revn=0;
while(n){
revn*=10;
revn+=n%10;
n/=10;
}
return revn;
}
int main(){
for(int i=1000;i<=9999;i++){
if(i*9==reverse(i)){
cout<<i<<endl;
}
}
return 0;
}
3对称平方数1
#include <iostream>
#include <cmath>
using namespace std;
//是否对称,即他的反序数==他本身
//输出反序数
int reverse(int n){
int revn=0;
while(n){
revn*=10;
revn+=n%10;
n/=10;
}
return revn;
}
int main(){
int i,s;
for(i=0;i<=256;i++){
s=pow(i,2);
if(s==reverse(s)){
cout<<i<<endl;
}
}
return 0;
}
4与7无关的数
#include <iostream>
#include <cmath>
using namespace std;
//某个位置为7
bool is7(int n){
while(n){
if(n%10==7){
return true;
}
n/=10;
}
return false;
}
//与7相关
bool relate7(int n){
if(n%7==0||is7(n)){
return true;
}
return false;
}
int main(){
int n,i,sum=0;
cin>>n;
for(i=1;i<=n;i++){
if(!relate7(i)){
sum+=pow(i,2);
}
}
cout<<sum;
return 0;
}
5百鸡问题
#include <iostream>
using namespace std;
int main(){
int x,y,z,n;
cin>>n;
//x+y+z=100,且注意因为是int数防止1/3变为0,要把5*x+3*y+ 1/3*z<=n写成5*x*3+3*y*3+1*z<=3*n,二重遍历
for(x=0;x<=100;x++){
for(y=0;y<=100-x;y++){
z=100-x-y;
if(5*x*3+3*y*3+1*z<=3*n){
cout<<x<<" "<<y<<" "<<z<<endl;
}
}
}
return 0;
}
6Old Bill
#include <iostream>
using namespace std;
int main(){
//价格为axyzb,共有n只,即总价格从大到小,第一个满足(a*10000+x*1000+y*100+z*10+b)%n==0,即最大单价
int n,x,y,z,a,b,sum;
bool flag;
while(cin>>n){
cin>>x>>y>>z;
flag=false;
for(a=9;a>=1;a--){
for(b=9;b>=0;b--){
sum=a*10000+x*1000+y*100+z*10+b;
if(sum%n==0){
cout<<a<<" "<<b<<" "<<sum/n;
flag=true;
break;
}
}
if(flag){
break;
}
}
if(!flag){
cout<<"没有";
}
}
return 0;
}
2.2模拟
1图形排版
1输出梯形
#include <iostream>
using namespace std;
int main(){
int h;
while(cin>>h){
int row=h;
int col=h+(h-1)*2;
for(int x=0;x<row;x++){
for(int y=0;y<col;y++){
if(y<col-(h+2*x)){
cout<<" ";
}else{
cout<<"*";
}
}
cout<<endl;
}
}
return 0;
}
2叠框
#include <iostream>
using namespace std;
char matrix[80][80];
int main(){
/*
由外圈向内圈赋值,先补全最外圈四个角,最后再去掉。
由(i,i)指圈左上角,(j,j)指圈右下角,最外框为(0,0),(n-1,n-1),最内圈为一个字符(n/2,n/2) ,且i+j=n-1,框的长度为n-2*i;
确定花纹填充,由内到外第几圈,对左上角为(i,i)通过(n/2-i) %2来判断
*/
int n;
char a,b;
bool flag=true;//判断是否为第一组数据
while(cin>>n>>a>>b){
if(flag){
flag=false;
}else{
cout<<endl;
}
for(int i=0;i<=n/2;i++){
int j=n-1-i;
int length=n-2*i;//边框长度
char c;//边框花纹
//判断花纹
if((n/2-i)%2==0){
c=a;
}else{
c=b;
}
//为当前圈赋值
for(int k=0;k<length;k++){
matrix[i][i+k]=c;
matrix[i+k][i]=c;
matrix[j][j-k]=c;
matrix[j-k][j]=c;
}
}
//把四个角去掉,若n为1则不用去
if(n!=1){
matrix[0][0]=' ';
matrix[0][n-1]=' ';
matrix[n-1][0]=' ';
matrix[n-1][n-1]=' ';
}
//打印
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<matrix[i][j];
}
cout<<endl;
}
}
return 0;
}