前提・実現したいこと
昨日のこの質問の続きのような形になってしまって申し訳ありません。
C言語で多倍長整数の加算の実装を行おうと考えています。
下の様なワークフローで4番の実装を行おうと考えていたのですが、どうも文字配列と数字配列の扱い方が上手くいきません。
64行目以降のfor (int i = 1; i < N; i++){
の部分で、二つの文字列から一つずつ要素を取り出し、数値型に変換する。数値型に変換した二つの要素を加算し、新規の配列に収納するという処理を行おうと思っているのですが、自分の意図した動作にならず、コードを自分の意図のようにかけません。
1. 文字列を2つ受け取る : ["1","2","3","4","5"] , ["1","7","8","9","1"] 2. 配列を逆に変換する : ["5","4","3","2","1"] 3. 作成された二つの配列のうち、大きいサイズの方のサイズを基に新しい配列を作成する。 4. 二つの配列のそれぞれの要素の足し算を行う 例 : [5,4,3,2,1] と [1,9,8,7,1] という配列の場合 [(5+1) , (4+9) , (3+8) , (2+7) , (1+1)] → [6,13,11,9,2] ※ もし リストへのアクセスができない、範囲外の場合は0を割り当てる。 7. ある桁の数が10以上であれば、その桁を-10して、次の桁に1足す [6,13,11,9,2] → [6,3,2,0,3] 8. 配列を逆順にして、文字列に直す → "30236"
該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <stdint.h> 4#include <string.h> 5#include <strings.h> 6#define MAX_INPUT 100 7 8 9// 二つの数を比較して大きい方を選択する 10int max(int a, int b) { return a > b ? a : b; } 11 12 13// 文字配列を逆順にする 14void revStr(char* str){ 15 int size = strlen(str); 16 int i,j; 17 char tmp = {0}; 18 19 for(i = 0, j = size - 1; i < size / 2; i++, j--){ 20 tmp = str[i]; 21 str[i] = str[j]; 22 str[j] = tmp; 23 } 24 25 return; 26} 27 28 29// main 30int main(){ 31 32 char input1[MAX_INPUT]; 33 char input2[MAX_INPUT]; 34 const char *p_input1; 35 const char *p_input2; 36 37 int input1_siz; 38 int input2_siz; 39 int ans_size; 40 41 42 printf("Enter The First LongInt \n"); 43 fgets(input1 , MAX_INPUT , stdin); 44 if(p_input1 = strchr(input1, '\n')){ 45 46 p_input1 = '\0'; 47 } 48 49 50 51 printf("Enter The Second LongInt \n"); 52 fgets(input2 , MAX_INPUT , stdin); 53 if(p_input2 = strchr(input2, '\n')){ 54 55 p_input2 = '\0'; 56 } 57 58 // input1,input2の配列サイズを入手する 59 input1_siz = strlen(input1); 60 input2_siz = strlen(input2); 61 62 // 二つの配列の内大きい方を作成する。 63 int N = (max(input1_siz, input2_siz)); 64 char ans_lis[N]; 65 66 revStr(input1); 67 revStr(input2); 68 69 for (int i = 0; i < N; i++){ 70 71 int num1 , num2; 72 // OutOfIndexしないようにする。 73 if(input1_siz < N){ 74 num1 = 0; 75 } 76 else{ 77 num1 = input1[i]- '0'; 78 } 79 80 if(input2_siz < N){ 81 num2 = 0; 82 } 83 else{ 84 num2 = input2[i] - '0'; 85 } 86 87 ans_lis[i] = (num1 + num2); 88 // printf("%d\n",ans_lis[i]); 89 // 最終的にはanslisも+'0'を行い文字列化する。 90 91 } 92 93 for(int i = 0; i <input1_siz;++i){ 94 printf("input1's no %d is %c \n" ,i,input1[i]); 95 } 96 97 for(int i = 0; i <input2_siz;++i){ 98 printf("input2's no %d is %c \n" ,i,input2[i]); 99 } 100 101 for(int i = 0; i <N;++i){ 102 printf("anslis's no %d is %d \n" ,i,ans_lis[i]); 103 } 104}
発生している問題・エラーメッセージ
発生している問題がいくつかあるのですが、
1.文字配列を一文字ずつprintfすると、先頭が空白?になる
2.入力が"123" , "456"の場合はint_ans_lisの構造を[9,7,5]というようにしたいが、できない - 解決しました。
3.int_ans_lisの先頭にアクセスすると、意図しない数字(1998638272)が出現する。 - 解決しました。
これらの問題に対処できません。
Enter The First LongInt 123 Enter The Second LongInt 456 input1's no 0 is input1's no 1 is 3 input1's no 2 is 2 input1's no 3 is 1 input2's no 0 is input2's no 1 is 6 input2's no 2 is 5 input2's no 3 is 4 anslis's no 0 is -76 anslis's no 1 is 9 anslis's no 2 is 7 anslis's no 3 is 5
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/01 09:16