7-1整除光棍
#include <stdio.h>
int main()
{
int x = 0, s = 0, n = 0; // 定义除数,被除数,位数
scanf("%d", &x);
while (s < x)
{
s = s * 10 + 1; // 被除数末位添1, 直到不小于被除数
++n; // 位数增1
}
while (1) // 开始进行除法运算
{
printf("%d", s / x); // 输出商, 从最高位一直输出到个位,因为最后一定能整除
s %= x; // 被除数更新为余数
if (s == 0) break; // 余数为0则结束
s = s * 10 + 1; // 余数末位添1
++n; // 位数增1
}
printf(" %d\n", n);
return 0;
}
7-3黑洞数
只算三位数:
#include<stdio.h>
int main(){
int i,max,min,num,f=0,a,b,c,t;
scanf("%d",&num);
while(num!=495||f==0){
a=num/100;b=num/10%10;c=num%10;
if(a<b) {t=a;a=b;b=t;}
if(a<c) {t=a;a=c;c=t;}
if(b<c) {t=b;b=c;c=t;}
max=a*100+b*10+c; min=a+b*10+c*100;
num=max-min; f++;
printf("%d: %d - %d = %d\n",f,max,min,num);
}
return 0;
}
任意数:
#include <iostream>
#include <vector>
#include <functional> // std::greater, std::less
#include <algorithm> // std::sort
#include <stack>
using namespace std;
int sortnumber(int n, const int& way) // 1: 最大,-1: 最小
{
vector<int> digit; // 记录 n 各个位上的数字
while (n != 0) {
digit.push_back(n % 10);
n /= 10;
}
if (way == 1) sort(digit.begin(), digit.end(), greater<int>());
else sort(digit.begin(), digit.end(), less<int>());
int l = pow(10, digit.size() - 1), res = 0;
for (int d : digit) {
res += d * l;
l /= 10;
}
return res;
}
int main()
{
int n;
while (cin >> n) {
int maxp = sortnumber(n, 1), minp = sortnumber(n, -1);
printf("min permutation: %d\n", minp);
printf("max permutation: %d\n", maxp);
stack<int> st;
for (int cnt = 1;; cnt++) {
int diff = maxp - minp;
if (!st.empty() && st.top() == diff) { // 连续出现!
maxp = sortnumber(diff, 1);
minp = sortnumber(diff, -1);
printf("%d : %d - %d = %d\n", cnt, maxp, minp, maxp - minp);
printf("黑洞数: %d\n", diff);
break;
}
else
st.push(diff);
printf("%d : %d - %d = %d\n", cnt, maxp, minp, diff);
maxp = sortnumber(diff, 1);
minp = sortnumber(diff, -1);
}
printf("\n");
}
return 0;
}
7-6梅森数
#include<stdio.h>
#include<math.h>
int main(){
int num,n,i,j,f=0;
scanf("%d",&n);
for(i=2;i<=n;i++){
num=pow(2,i)-1;
for(j=2;j<=sqrt(num);j++)
if(num%j==0) break;
if(j>sqrt(num)){
printf("%d\n",num);
f++;
}
}
if(f==0) printf("None");
return 0;
}
10-3 方阵循环右移
#include <stdio.h>
//错误原因:没有考虑m比n大的情况,要取余.
int main()
{
int m,n,i,j;
scanf("%d%d", &m, &n);
int a[n][n], b[n][n];
int num = 1;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
scanf("%d", &a[i][j]);
}
}
m%=n;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
if (m+i <= n-1) b[j][m+i] = a[j][i];
else b[j][i+m-n] = a[j][i];
}
}
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
printf("%d", b[i][j]);
printf(" ");
if (num %n == 0) printf("\n");
num++;
}
}
return 0;
}
//百度找的方法:
/*这个题目分成两部分输出就好考虑多了*/
//#include<stdio.h>
//int main(){
// int a[10][10],i,j,n,m;
// scanf("%d %d",&m,&n);
// for(i=0;i<n;i++)
// for(j=0;j<n;j++)
// scanf("%d",&a[i][j]);
// m=m%n; //可能会出现m比n还大所以取余数
// for(i=0;i<n;i++){
// for(j=n-m;j<n;j++) //先输出 右移的部分
// printf("%d ",a[i][j]);
// for(j=0;j<n-m;j++) //输出剩下的部分
// printf("%d ",a[i][j]);
// printf("\n");
// }
// return 0;
//}
10-4判断上三角矩阵
#include <stdio.h>
// 错误原因:flag放的位置错了
int main()
{
int t;
scanf("%d" ,&t);
int n,i,j;
//int flag = 1;
int a[10][10];
while (t)
{
int flag = 1;
t--;
scanf("%d", &n);
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
scanf("%d", &a[i][j]);
}
}
for (i=1; i<n; i++)
{
for (j=0; j<i; j++)
{
if (a[i][j] != 0){
flag = 0;
break;
}
}
}
if (flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
10-9 矩阵乘法
#include <stdio.h>
//错误原因:算矩阵的乘积的时候是要加总的,我忘了,还有就是用第三个数组会涉及到有没有全部初始化为0的问题,故用sum代替。
int main()
{
int Ra,Ca;
scanf("%d%d", &Ra, &Ca);
int i,j,k;
int a[Ra][Ca];
for (i=0; i<Ra; i++)
{
for (j=0; j<Ca; j++)
{
scanf("%d", &a[i][j]);
}
}
int Rb,Cb;
scanf("%d%d", &Rb, &Cb);
int b[Rb][Cb];
for (i=0; i<Rb; i++)
{
for (j=0; j<Cb; j++)
{
scanf("%d", &b[i][j]);
}
}
if (Ca == Rb)
{
printf("%d %d\n", Ra, Cb);
//int c[Ra][Cb] = {0};
for (i=0; i<Ra; i++)
{
for (j=0; j<Cb; j++)
{
int sum = 0;
for (k=0; k<Ca; k++)
{
sum += b[k][j] * a[i][k];
}
if (j<Cb-1) printf("%d ", sum);
else printf("%d\n", sum);
}
}
}
else printf("Error: %d != %d" ,Ca, Rb);
return 0;
}
10-6 杨辉三角
#include <stdio.h>
int main()
{
int n,i,j;
scanf("%d", &n);
int a[n][n];
for (i=0; i<n; i++)
{
a[i][0] = 1;
a[i][i] = 1;
}
for (i=2; i<n; i++)
{
for (j=1; j<i; j++)
{
a[i][j] = a[i-1][j-1] + a[i-1][j];
}
}
for (i=0; i<n; i++)
{
for (j=1; j<n-i; j++) printf(" ");
for (j=0; j<=i; j++)
{
printf("%4d" ,a[i][j]);
if (j==i) printf("\n");
}
}
return 0;
}
10-7螺旋方阵
#include <stdio.h>
int main()
{
int n,i,j;
int c = 1;
int x=0, y=0;
scanf("%d", &n);
int a[10][10] = {0};
a[x][y] = c;
while ( c!= n*n)
{
while (y<n-1 && !a[x][y+1]) a[x][++y] = ++c;
while (x<n-1 && !a[x+1][y]) a[++x][y] = ++c;
while (y>0 && !a[x][y-1]) a[x][--y] = ++c;
while (x>0 && !a[x-1][y]) a[--x][y] = ++c;
}
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
printf("%3d", a[i][j]);
if (j==n-1) printf("\n");
}
}
return 0;
}