#2
by かずま » 8年前
DayDreamer さんが書きました:
またUP内の変数全てと一致しなかった場合のケースも作るため、for構文で全チェックする方法も出来ませんでした。
for文でできますよ。
コード:
#include <stdio.h>
int UP[7] = { 1, 2, 3, 7, 8, 9, 11 };
int main(void)
{
int x, i;
while (printf("x: "), scanf("%d", &x) == 1) {
for (i = 0; i < 7; i++)
if (UP[i] == x) break;
if (i < 7)
printf("UP[%d] = %d\n", i, x);
else
puts("not found");
}
}
DayDreamer さんが書きました:
最悪総当たりで書いてしまおうかと思ってはいるのですが、スマートな解決方がありましたらご教授いただけると幸いです。
配列が昇順に並んでいるなら、二分探索でできますよ。
コード:
#include <stdio.h>
int UP[7] = { 1, 2, 3, 7, 8, 9, 11 };
int binary_search(int x)
{
int left = 0, right = 7 - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (UP[mid] < x) left = mid + 1;
else if (UP[mid] > x) right = mid - 1;
else return mid;
}
return -1;
}
int main(void)
{
int x;
while (printf("x: "), scanf("%d", &x) == 1) {
int i = binary_search(x);
if (i >= 0)
printf("UP[%d] = %d\n", i, x);
else
puts("not found");
}
}
[quote="DayDreamer" id=3,19448,147067]
またUP内の変数全てと一致しなかった場合のケースも作るため、for構文で全チェックする方法も出来ませんでした。[/quote]
for文でできますよ。
[code=c]
#include <stdio.h>
int UP[7] = { 1, 2, 3, 7, 8, 9, 11 };
int main(void)
{
int x, i;
while (printf("x: "), scanf("%d", &x) == 1) {
for (i = 0; i < 7; i++)
if (UP[i] == x) break;
if (i < 7)
printf("UP[%d] = %d\n", i, x);
else
puts("not found");
}
}
[/code]
[quote="DayDreamer" id=3,19448,147067]
最悪総当たりで書いてしまおうかと思ってはいるのですが、スマートな解決方がありましたらご教授いただけると幸いです。[/quote]
配列が昇順に並んでいるなら、二分探索でできますよ。
[code=c]
#include <stdio.h>
int UP[7] = { 1, 2, 3, 7, 8, 9, 11 };
int binary_search(int x)
{
int left = 0, right = 7 - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (UP[mid] < x) left = mid + 1;
else if (UP[mid] > x) right = mid - 1;
else return mid;
}
return -1;
}
int main(void)
{
int x;
while (printf("x: "), scanf("%d", &x) == 1) {
int i = binary_search(x);
if (i >= 0)
printf("UP[%d] = %d\n", i, x);
else
puts("not found");
}
}
[/code]