一回も披露したことのない豆知識

以下はxのべき乗でn桁以下の最大数を求めるプログラムですが、このプログラムを修正してxのべき乗でn桁を超える最小数を求めるプログラムを作りたいと思っています。どのように修正すべきかお教えください。
(xのべき乗でn桁以下の最大数を求めるプログラム)
#include <stdio.h>
#include <string.h>


int main() {
int x,n;
scanf("%d %d",&x,&n);
int m[n+ 1],prev[n+ 1];
m[0] = 1;
for (int i = 1;i <= n;i++) {
m[i] = 0;
}
for (int i = 0;m[n] == 0;) {
int cary = 0;
memcpy(prev,m,sizeof(int) * (n + 1));
for (int j = 0;j <= i;j++) {
m[j] = cary + prev[j] * x;
cary = m[j] / 10;
m[j] %= 10;
}
if (cary != 0) {
m[++i] = cary;
}
}
for (int i = n- 1;i >= 0;i--) {
printf("%d",prev[i]);
}
printf("\n");
return 0;
}

質問者からの補足コメント

  • ご回答ありがとうございました。
    入力 3 2 出力 243、入力 2 3 出力 1024と正しく出力されますが、
    入力 2 10 出力 1179869184ですが、正しくは 17179869184
    入力 9 20 出力 -1635124439ですが、正しくは 109418989131512359209↵
    とならなければなりません。
    プログラムをどう修正すればよいでしょうか。↵

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/07/19 18:41

A 回答 (1件)

#include <stdio.h>


#include <string.h>
#include <math.h>


int main(void) {
 int x,n;
 scanf("%d %d",&x,&n);
 int m[n+1],prev[n+1];
 m[0] = 1;
 for (int i = 1; i <= n; i++) {
  m[i] = 0;
 }
 for (int i = 0; m[n] == 0; ) {
  int cary = 0;
  memcpy(prev, m, sizeof(int) * (n + 1));
  for (int j = 0; j <= i; j++) {
   m[j] = cary + prev[j] * x;
   cary = m[j] / 10;
   m[j] %= 10;
  }
  if (cary != 0) {
   m[++i] = cary;
  }
 }
 int temp = 0;
 for (int i = n - 1; i >= 0; i--) {
  temp += prev[i] * pow(10, i);
 }
 printf("%d\n", temp * x);
 return 0;
}
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2021/07/19 20:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!