0
#include <iostream>
using namespace std;
void input_Array(char (&A)[10][10], int x, int y);
int calc_Collision(char (&A)[10][10]);
void display(char (&A)[10][10]);
void init_Array(char (&A)[10][10]);
int main()
{
int m,n,test;
char A[10][10];
init_Array(A);
cin>>test;
while (test>0)
{
cin>>m>>n;
input_Array(A,m,n);
display(A);
cout<<"FLAG";
cout<<calc_Collision(A);
test--;
}
}
//Calculates no. of ways to select two 1's in each column
int calc_Collision(char (&A)[10][10])
{
int count=0;
int sum=0;
int select(int x, int y);
for (int j = 0; j<10; j++)
{
count=0;
for(int i = 0; i<10; i++)
{
if (A[i][j]=='1')
{
count++;
}
}
sum=sum + select(count,2);
}
return sum;
}
//Returns no. of ways to select y items from x items
int select(int x, int y)
{
int fact(int a);
return (fact(x)/(fact(y)*fact(x-y)));
}
//Returns a!
int fact(int a)
{
if (a==0)
{
return 1;
}
else
{
return (a*fact(a-1));
}
}
void display(char (&A)[10][10])
{
for (int i=0; i<10; i++)
{
for (int j=0; j<10; j++)
{
cout<<A[i][j]<<"\t";
}
cout<<"\n";
}
}
入力形式:
ありません。トライアルのセグメンテーション違反[2Dアレイ]
いいえ。行数(空白)はありません。列
ROW1(スペースがありません、1または0のみ)
ROW2 ...の
出力:
2D配列
合計がありません。各列に2つの1年代を選択する方法の
問題:
プログラムは罰金十分な配列が表示されます。
しかしcalc_Collision(A)、コード出力を横切って来る時:
セグメンテーション障害(コアダンプ)
"FLAG" が表示されません。
ここでも初心者であれば、どんな助力にも感謝します。
適切なツールは、これはあなたのデバッガで解決するために:あなただけNC2を計算しているので (N 2を選択)、
select
関数は次のように書き直すことができます。デバッグは不可欠なスキルです。詳細については、[こちら](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。 – Rakete1111このエラーの原因は何ですか? – Beta
'fact'は12より大きい入力でオーバーフローすることに注意してください。おそらく、階乗に直接関係しない' select'を計算する方法が必要です。 (ヒント:数式を使用して数式を導出する) – molbdnilo