一、计算n的m次方(理论上只需要更改数组result[...]的元素个数,可以输出无穷大的结果)
#include<stdio.h>
#define ULLONG (unsigned long long)1000000000000000000ULL
int main(){
int n;
int m;
int cc=0; //监控循环次数
unsigned long long result[10] = {1,0,0,0,0,0,0,0,0,0};
printf("\n\n ");
printf("输入两个数 N 和 M,系统将计算 N 的 0 至 M 的次方:");
scanf("%d %d", &n, &m);
for(int i=0;i<10;i++){
while(cc<=m && result[i] < ULLONG){
for(int j=0;j<i;j++){
result[j+1] = result[j+1] + result[j] / ULLONG;
result[j] = result[j] % ULLONG;
}
printf("\n ");
printf(" %d 的 %-3d 次方是 %llu", n, cc, result[i]);
for (int p = i; p > 0 ; p--) {
if (result[p-1] != 0) {
printf("%018llu", result[p-1]);
}
}
for(int g=0;g<i+1;g++){
result[g]*=n;
}
cc++;
}
}
return 0;
}
![]()
二、对每个k从1到n,分别统计1到k的所有数字的首位分布,然后将所有的1到k的首位数字分布累加,并输出
#include<stdio.h>
int main() {
int Max = 10000;
int base = Max + 1;
//初始化结果数组为0,result的0到9分别代表首位数是0到9
int result[10] = {0};
for (int d = 1; d <= 9; d++) { // 首位数字d从1到9
// 当前位数基数(10^k),1代表1位数数字,2代表讨论2位数数字
long long power = 1;
while (1) {
long long lower = d * power; // 当前区间下界
if (lower > Max) break;
long long upper = (d + 1) * power - 1; // 当前区间上界
if (upper > Max) upper = Max;// 确保不超出Max
long long n = upper - lower + 1; // 区间内的数字个数
// 当前区间对应的j值之和,等差数列求和,下面打个比分
//比如当区间是10到19时,10出现次数9990 11出现次数9909,19出现次数9981
//所以当d=1,power=2时,求所有10到19的个数,就是等差求和
long long sum_j = n * ( (base - lower) + (base - upper) ) / 2;
result[d] += sum_j; // 累加到对应首位
if (upper == Max) break; // 已处理到最大值,退出循环
power *= 10; // 增加位数(扩大10倍)
}
}
// 输出结果(0-9,其中0始终为0)
for (int i = 0; i < 10; i++) {
printf("%d\n", result[i]);
}
return 0;
}
![image]()